﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CoreData;
using RegisterService;
using Helper;
using ActionServices;
using System.Reflection;
using SchoolManagementSystem.Controls;
using DevExpress.XtraEditors;
using System.Runtime.InteropServices;
using System.Threading;
namespace SchoolManagementSystem.Forms.BusinessForm
{
    //đặt cọc: chưa học nhưng đặt cọc trước
    public partial class frmStudentdeposit: DevExpress.XtraEditors.XtraForm
    {
        long TempStudentID = 0;
        long BranchID = 0;
        long _id;
        string message;
        long ID
        {
            set
            {
                _id = value;
                Details();
            }
            get
            {
                return _id;
            }
        }
        public bool SaveAble
        {
            get
            {
                return commandBarUC1.cmdsave.Enabled;
            }
            set
            {
                commandBarUC1.cmdsave.Enabled = value;
            }
        }
        ITempStudentDepositActionService Service = RegisterService.RegisterServices.TempStudentDepositService;
        TempStudent TempST;
        public frmStudentdeposit(long TempStudentID)
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
            this.gridView1.ViewCaption = string.Empty;
            this.TempStudentID = TempStudentID;
            TempST = RegisterService.RegisterServices.TempStudentService.GetByID(this.TempStudentID) as TempStudent;
            LoadData();
            commandBarUC1.cmdnew.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(cmdnew_ItemClick);
            commandBarUC1.cmdsave.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(cmdsave_ItemClick);
            commandBarUC1.cmdrefresh.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(cmdrefresh_ItemClick);
            SaveAble = false;
            commandBarUC1.cmdhelp.Visibility = DevExpress.XtraBars.BarItemVisibility.Never;
            commandBarUC1.cmdcopy.ItemClick += new DevExpress.XtraBars.ItemClickEventHandler(cmdcopy_ItemClick);
            //dateEdit_DespositDate.DateTime = DateTime.Now;
            AddTextChanged(this.splitContainerControl1.Panel2.Controls);
            cmddangkylop.Enabled = false;
            textEdit_Money.EditValue = 0;
            
            
        }

        void cmdnew_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ID = 0;
            //dateEdit_DespositDate.DateTime = DateTime.Now;
            buttonEdit_Branch.EditValue = String.Empty;
            BranchID = 0;
            textEdit_Money.EditValue = 0;
            comboBoxEdit_SelectYear.SelectedItem = DateTime.Now.Year.ToString();
            comboBoxEdit_SelectMonth.SelectedItem = DateTime.Now.Month.ToString();
            memoEdit_note.Text = string.Empty;
 
        }
        void cmdcopy_ItemClick(object sender,  DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ID = 0;
        }
        void cmdsave_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            SaveData();
        }
        void cmdrefresh_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            ReloadData();
        }

        void LoadData()
        {
            try
            {
                IList<TempStudentDeposit> datas = Service.GetList(" TempStudentID=" + this.TempStudentID) as List<TempStudentDeposit>;
                if (datas == null)
                {
                    datas = new List<TempStudentDeposit>();
                }
                long Count = datas.Count;
                gridControl1.DataSource = datas;
                gridControl1.RefreshDataSource();
                gridView1.ViewCaption = "Danh sách có " + Count + " dòng";
                if (Count != 0 && ID == 0)
                {
                    gridView1.FocusedRowHandle = 0;
                }
               
                SetDescriptionForColumn.SetDescription(gridView1, new TempStudentDeposit());
                SetFormatGridColumn.Format(null, gridView1, "Money");
            }
            catch
            {
            }

        }

        void ReloadData()
        {
            LoadData();    
            for (int i=0; i < gridView1.RowCount; i++)
            {
               if ((long)gridView1.GetRowCellValue(i, "ID") == ID)
               {
                   gridView1.FocusedRowHandle = i;
               }
            }          
        }

        void SaveData()
        {
          
            TempStudentDeposit data = Service.GetByID(ID) as TempStudentDeposit;
            if (data == null)
            {
                data = new TempStudentDeposit();
                data.NameExt = TempST.Name;
            }
            var ExistItem = Service.GetByTempStudentIdAndBranch(this.TempStudentID, BranchID);
            if(ExistItem==null)
            {
                data.DepositDate = dateEdit_DespositDate.DateTime;
                data.BranchID = BranchID;
                data.BranchExt = buttonEdit_Branch.EditValue.ToString();
                data.Money = int.Parse(textEdit_Money.EditValue.ToString());
                data.Note = memoEdit_note.Text;
                data.TempStudentID = this.TempStudentID;
                if (comboBoxEdit_SelectMonth.SelectedItem != null)
                {
                    data.SelectMonth = int.Parse(comboBoxEdit_SelectMonth.SelectedItem.ToString());
                }
                if (comboBoxEdit_SelectYear.SelectedItem != null)
                {
                    data.SelectYear = int.Parse(comboBoxEdit_SelectYear.SelectedItem.ToString());
                }
                ID = Service.Save(data, ref message);
                if (ID > 0)
                {
                    MessageControl.ShowMessage("Đặt cọc thành công, vui lòng thông báo kế toán tạo phiếu thu đặt cọc."+Environment.NewLine+"Thông tin như sau: Tên: "+data.NameExt +", Ngành: "+data.BranchExt, "Thông báo", MessageControl.Icon.Info);
                    SaveAble = false;
                    ReloadData();
                }
                else
                {
                    MessageControl.ShowMessage("Lỗi không thể tạo đặt cọc, vui lòng thử lại", "Lỗi", MessageControl.Icon.Error);
                }
            }
            else{
                MessageControl.ShowMessage("Học viên đã đặt cọc ngành này rồi","",MessageControl.Icon.Warning);
               
            }
        }

        private void gridView1_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            
        
            try
            {
                if (gridView1.RowCount != 0)
                {
                    ID = long.Parse(gridView1.GetRowCellValue(e.FocusedRowHandle, "ID").ToString());
                    Details();
                }
            }
            catch { }


        }

        private void Details()
        {
            var data = RegisterService.RegisterServices.TempStudentDepositService.GetByID(ID) as TempStudentDeposit;
            if (data == null)
            {
                data = new TempStudentDeposit();
                cmddangkylop.Enabled = false;
            }
            else
            {
                cmddangkylop.Enabled = true;
            }
            BranchID = data.BranchID;
            if (data.SelectMonth != 0)
                comboBoxEdit_SelectMonth.SelectedItem = data.SelectMonth.ToString();
            else
                comboBoxEdit_SelectMonth.SelectedIndex = -1;
            if (data.SelectYear != 0)
                comboBoxEdit_SelectYear.SelectedItem = data.SelectYear.ToString();
            else
                comboBoxEdit_SelectYear.SelectedIndex = -1;
            buttonEdit_Branch.EditValue = data.BranchExt;
            textEdit_Money.EditValue = data.Money;
            dateEdit_DespositDate.DateTime = data.DepositDate;
            memoEdit_note.Text = data.Note;
        }

       

        private void buttonEdit_Branch_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
               
            if (e.Button.Index == 0)
            {
                frmSelectBranch st = new frmSelectBranch();
                if (st.ShowDialog() == DialogResult.OK)
                {
                    string data = st.Name;
                    buttonEdit_Branch.EditValue = data;
                    BranchID = st.ID;
                }
                else
                {
                    buttonEdit_Branch.EditValue = string.Empty;
                    BranchID = 0;
                }
            }
        
        }

        private void xóaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Delete();
        }

        protected void Delete()
        {

            if (gridView1.FocusedRowHandle < 0)
                return;

            if (XtraMessageBox.Show(String.Format("{0} {1} sẽ bị xóa khỏi hệ thống, bạn có đồng ý?", "[Đặt cọc]", TempST.Name), String.Format("Xóa {0}", "Đặt cọc"), MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
            {
                bool IsDeleted = Service.Delete(Service.GetByID(ID));
                if(IsDeleted)
                {
                    XtraMessageBox.Show("Xóa dữ liệu thành công");
                    ReloadData();
                    if (gridView1.RowCount != 0)
                    {
                        ID = long.Parse(gridView1.GetRowCellValue(0, "ID").ToString());
                    }
                    else
                    {
                        ID = 0;
                    }
                    Details();
                }
                else{
                    XtraMessageBox.Show("Lỗi, không thể xóa dữ liệu");
                }
            }
        }



        protected void AddTextChanged(Control.ControlCollection controls)
        {

            for (int i = 0; i < controls.Count; i++)
            {
                Type type = controls[i].GetType();

                if (type == typeof(DateEdit))
                {
                    ((DateEdit)controls[i]).EditValueChanged += new EventHandler(TextChangeCatcher);
                }
                if (type == typeof(CheckEdit))
                {
                    ((CheckEdit)controls[i]).CheckedChanged += new EventHandler(TextChangeCatcher);
                }
                else if (type == typeof(TextBox) || type == typeof(TextEdit) || type == typeof(MemoEdit))
                {
                    controls[i].TextChanged += new EventHandler(TextChangeCatcher);
                   
                }
                if (type == typeof(CheckEdit))
                {
                    ((CheckEdit)controls[i]).CheckedChanged += new EventHandler(TextChangeCatcher);
                }
                if (type == typeof(LookUpEdit))
                {
                    ((LookUpEdit)controls[i]).EditValueChanged += new EventHandler(TextChangeCatcher);
                }
               
                if (type == typeof(SpinEdit))
                {
                  
                    ((SpinEdit)controls[i]).ValueChanged += new EventHandler(TextChangeCatcher);
                   
                }
               
                if (type == typeof(ComboBoxEdit))
                {
                    ((ComboBoxEdit)controls[i]).EditValueChanged += new EventHandler(TextChangeCatcher);
                }
              
                if (type == typeof(ButtonEdit))
                {
                    ((ButtonEdit)controls[i]).EditValueChanged += new EventHandler(TextChangeCatcher);
                }
            }
        }

        protected void TextChangeCatcher(object sender, EventArgs e)
        {
                SaveAble = true;
        }

        #region RegisterKeyPress

        //----------------------------------------------
        // Define the PeekMessage API call
        //----------------------------------------------

        private struct MSG
        {
            public IntPtr hwnd;
            public int message;
            public IntPtr wParam;
            public IntPtr lParam;
            public int time;
            public int pt_x;
            public int pt_y;
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern bool PeekMessage([In, Out] ref MSG msg,
            HandleRef hwnd, int msgMin, int msgMax, int remove);

        //----------------------------------------------

        /// <span class="code-SummaryComment"><summary> </span>
        /// Trap any keypress before child controls get hold of them
        /// <span class="code-SummaryComment"></summary></span>
        /// <span class="code-SummaryComment"><param name="m">Windows message</param></span>
        /// <span class="code-SummaryComment"><returns>True if the keypress is handled</returns></span>
        protected override bool ProcessKeyPreview(ref Message m)
        {
            const int WM_KEYDOWN = 0x100;
            const int WM_KEYUP = 0x101;
            const int WM_CHAR = 0x102;
            const int WM_SYSCHAR = 0x106;
            const int WM_SYSKEYDOWN = 0x104;
            const int WM_SYSKEYUP = 0x105;
            const int WM_IME_CHAR = 0x286;

            KeyEventArgs e = null;

            if ((m.Msg != WM_CHAR) && (m.Msg != WM_SYSCHAR) && (m.Msg != WM_IME_CHAR))
            {
                e = new KeyEventArgs(((Keys)((int)((long)m.WParam))) | ModifierKeys);
                if ((m.Msg == WM_KEYDOWN) || (m.Msg == WM_SYSKEYDOWN))
                {
                    TrappedKeyDown(e);
                }
                //else
                //{
                //    TrappedKeyUp(e);
                //}

                // Remove any WM_CHAR type messages if supresskeypress is true.
                if (e.SuppressKeyPress)
                {
                    this.RemovePendingMessages(WM_CHAR, WM_CHAR);
                    this.RemovePendingMessages(WM_SYSCHAR, WM_SYSCHAR);
                    this.RemovePendingMessages(WM_IME_CHAR, WM_IME_CHAR);
                }

                if (e.Handled)
                {
                    return e.Handled;
                }
            }
            return base.ProcessKeyPreview(ref m);
        }

        private void RemovePendingMessages(int msgMin, int msgMax)
        {
            if (!this.IsDisposed)
            {
                MSG msg = new MSG();
                IntPtr handle = this.Handle;
                while (PeekMessage(ref msg,
                new HandleRef(this, handle), msgMin, msgMax, 1))
                {
                }
            }
        }

        /// <span class="code-SummaryComment"><summary></span>
        /// This routine gets called if a keydown has been trapped 
        /// before a child control can get it.
        /// <span class="code-SummaryComment"></summary></span>
        /// <span class="code-SummaryComment"><param name="e"></param></span>
        private void TrappedKeyDown(KeyEventArgs e)
        {
            PressKey(e);
        }


        void PressKey(KeyEventArgs e)
        {
            if (e.Control)
            {
                switch (e.KeyCode)
                {
                    case Keys.N:
                        ID = 0; Details();
                        break;
                    case Keys.S:
                        SaveData();
                        break;

                   
                }
            }

            if (e.KeyCode == Keys.F5)
            {
                LoadData();
            }
            else if (e.KeyCode == Keys.Delete)
            {
              
                Delete();
            }
           

        }

        #endregion

        private void cmddangkylop_Click(object sender, EventArgs e)
        {

            Thread threadExcute = new Thread(new ThreadStart(() => RegisterClass()));
            threadExcute.Start();
            
        }

        void RegisterClass()
        {
            this.Invoke((MethodInvoker)delegate
            {

                try
                {
                    if (ID < 0)
                    {
                        MessageControl.ShowMessage("Vui lòng lưu lại thông tin trước khi đăng ký học", "Error", MessageControl.Icon.Error);
                        return;
                    }
                    Student st = new Student();
                    frmSelectClass selectclass = new frmSelectClass();
                    if (selectclass.ShowDialog() == DialogResult.OK)
                    {
                        st.ClassID = selectclass.ID;
                    }
                    if (st.ClassID == 0)
                    {
                        MessageControl.ShowMessage("Chưa chọn lớp", "Error", MessageControl.Icon.Error);
                        return;
                    }

                    splashScreenManager1.ShowWaitForm();
                    st.Active = false;
                    st.Address = TempST.Address;
                    st.Bonus = 0;
                    st.Code = RegisterService.RegisterServices.StudentService.GenerateCode(st.ClassID);
                    st.Name = TempST.FirstName + " " + TempST.LastName;
                    st.LastName = TempST.LastName;
                    st.FirstName = TempST.FirstName;
                    st.Note = TempST.Note;
                    st.Email = TempST.Email;
                    st.Phone = TempST.Phone;
                    st.DateOfBirth = TempST.DayOfBirth;
                    st.PlaceOfBirth = TempST.PlaceOfBirth;
                    st.ChannelInfoID = TempST.ChannelInfoID;
                    st.TotalFee = ((Class)RegisterService.RegisterServices.ClassService.GetByID(st.ClassID)).Price;
                    st.DateOfAdmission = ((Class)RegisterService.RegisterServices.ClassService.GetByID(st.ClassID)).StartDate;
                    st.RegisterDate = DateTime.Now;
                    st.Sex = TempST.Sex;
                    st.TempStudentID = TempST.ID;
                    st.RegisterDate = dateEdit_DespositDate.DateTime;
                    st.Province = TempST.Province;
                    st.TypeOfFee = 1;
                    st.Status = 3;//set defult is "Signed up";
                    string mess = "";
                    var id = RegisterService.RegisterServices.StudentService.Save(st, ref mess);

                    if (id > 0)
                    {

                        TempST.IsRegister = true;
                        TempST.Status = 5;
                        var st_id = RegisterService.RegisterServices.TempStudentService.Save(TempST, ref message);

                        //kiem tra xem trong bang kết quả đã có chưa nếu có rồi thì không thêm
                        var checkExist = RegisterService.RegisterServices.StudentResultService.GetByStudentID(id);
                        if (checkExist == null)
                        {
                            var subjectpointcolumn = RegisterService.RegisterServices.SubjectPointColumnService.GetSubjectPointColumnByClassID(st.ClassID);
                            if (subjectpointcolumn != null)
                            {
                                for (int i = 0; i < subjectpointcolumn.Count; i++)
                                {
                                    Student_Result st_r = new Student_Result();
                                    st_r.StudentID = id;
                                    st_r.Subject_PointColumnID = subjectpointcolumn[i].ID;
                                    st_r.Value = 0;
                                    RegisterService.RegisterServices.StudentResultService.Save(st_r);
                                }
                            }

                        }

                        #region thu dat coc
                        var checkVoucherFee = RegisterService.RegisterServices.ReceiptVoucherFeeService.GetOneByLINQ(c => c.BranchID == BranchID && c.TempStudentID == TempStudentID);
                        if (checkVoucherFee == null)
                        {
                            Nullable<long> money = textEdit_Money.EditValue as Nullable<long>;
                            if (money != null && money > 0)
                            {
                                Voucher data = new Voucher();

                                data.CreateDate = DateTime.Now;

                                data.BillNo = string.Empty;

                                data.Description = "Học viên " + TempST.Name + " - lớp " + selectclass.Name + " đặt cọc: " + textEdit_Money.Text + " - ngày " + data.CreateDate.ToShortDateString();
                                data.ModifieBy = ValueDefine.StaffID;
                                data.PaymentMethod = 1;// comboboxUC_PaymentMethod.ID;
                                data.ReceiptReason = 1; //default =1
                                data.MoneyType = 0;
                                data.ModifieDate = DateTime.Now;
                                data.Excuter = 2;
                                data.CreateBy = ValueDefine.StaffID;
                                data.ReceiptNo = RegisterService.RegisterServices.VoucherService.GenerateReceiptNo(data.CreateDate);
                                long voucherid = RegisterService.RegisterServices.VoucherService.Save(data, ref message);
                                //tạm thời không auto tạo phiếu
                                //if (voucherid > 0)
                                //{
                                //    //mặt định đặt cọc là đặt cọc cho học phí lần 1.
                                //    var fee_voucher = new Receipt_VoucherFee();
                                //    var studentfeetime = RegisterService.RegisterServices.StudentFeeTimeService.GetStudentFeeTimeByStudentIDAndType(id, 1);//Lấy lần đóng học phí theo ID học viên và loại đóng
                                //    Receipt_FeeTimeObject item = new Receipt_FeeTimeObject();
                                //    item.starttime = studentfeetime.StartDate1;
                                //    item.endtime = studentfeetime.EndDate1;
                                //    item.Name = "Lần 1";
                                //    fee_voucher.TimeFee = item.ToString();
                                //    fee_voucher.StudentID = id;
                                //    fee_voucher.VoucherID = voucherid;
                                //    fee_voucher.Type = 0;
                                //    fee_voucher.Money = int.Parse(textEdit_Money.EditValue.ToString());
                                //   var fee_voucherId = RegisterService.RegisterServices.ReceiptVoucherFeeService.Save(fee_voucher);
                                //   if (fee_voucherId > 0)
                                //   {
                                //       MessageControl.ShowMessage("Do kế toán chưa tạo phiếu thu đặt cọc cho học viên này." + Environment.NewLine + "Nên chương trình tự động tạo phiếu thu đặt cọc với mã phiếu (" + data.ReceiptNo + ")." + Environment.NewLine + "Vui lòng thông báo cho kế toán nhập số tiền đặt cọc cho mã phiếu này", "Thông tin", MessageControl.Icon.Info);
                                //   }
                                //   else
                                //   {
                                //       RegisterService.RegisterServices.VoucherService.Delete(RegisterService.RegisterServices.VoucherService.GetByID(voucherid));
                                //       MessageControl.ShowMessage("Vui lòng thông báo cho kế toán tạo phiếu đặt cọc", "Thông tin", MessageControl.Icon.Info);
                                           
                                //   }
                                //}
                            }
                        }
                        else //nếu có rồi thi tiên hành cập nhật lại thông tin
                        {
                            checkVoucherFee.TempStudentID = 0;
                            checkVoucherFee.BranchID = 0;
                            checkVoucherFee.StudentID = id;
                            checkVoucherFee.Type = 0;
                            var studentfeetime = RegisterService.RegisterServices.StudentFeeTimeService.GetStudentFeeTimeByStudentIDAndType(id, 1);//Lấy lần đóng học phí theo ID học viên và loại đóng
                            Receipt_FeeTimeObject item = new Receipt_FeeTimeObject();
                            item.starttime = studentfeetime.StartDate1;
                            item.endtime = studentfeetime.EndDate1;
                            item.Name = "Lần 1";
                            checkVoucherFee.TimeFee = item.ToString();
                            RegisterService.RegisterServices.ReceiptVoucherFeeService.Save(checkVoucherFee);
                            //cap nhat la hoc phi da dong
                            var studentFee = RegisterService.RegisterServices.Student_FeeService.GetByStudentID(id);
                            studentFee.Money = checkVoucherFee.Money;

                            RegisterService.RegisterServices.Student_FeeService.Save(studentFee);
                        }
                        #endregion

                        //luu lai lich su mới
                        Student_History historynew = new Student_History();
                        historynew.StudentID = id;
                        historynew.Content = "Đã đăng ký học lớp " + ((Class)RegisterService.RegisterServices.ClassService.GetByID(st.ClassID)).Name;
                        historynew.Content += " vào ngày " + DateTime.Now.ToShortDateString();
                        RegisterService.RegisterServices.StudentHistoryService.Save(historynew);
                        Thread.Sleep(2000);
                        splashScreenManager1.CloseWaitForm();
                        MessageControl.ShowMessage("Đã đăng ký học thành công, vui lòng trở lại màn hình học viên để cập nhật đầy đủ thông tin", "Info", MessageControl.Icon.Info);
                       bool isDeleted = Service.Delete(Service.GetByID(ID));
                    }
                    else
                    {
                        splashScreenManager1.CloseWaitForm();
                        MessageControl.ShowMessage("Có lỗi xảy ra, đăng ký học không thành công", "Error", MessageControl.Icon.Error);

                    }
                }
                catch (Exception ex)
                {
                    splashScreenManager1.CloseWaitForm();
                    MessageControl.ShowMessage("Có lỗi xảy ra, đăng ký học không thành công \n Chi tiết lỗi: " + ex.Message, "Error", MessageControl.Icon.Error);
                }


            });
        }

    }
}
